﻿///<copyright>
///Topbot (c) http://ya.topbloger.ru, 2008
///</copyright>
namespace BlogsAPI
{
    using System.Diagnostics;
    using System;
    using System.Web;
    using BlogsYandex;
    using System.Xml.Serialization;

    /// <summary>
    /// Уровень доступа к создаваемому посту
    /// </summary>
    public enum PostType : short
    {
        /// <summary>
        /// Доступный всем
        /// </summary>
        Public = 0,
        /// <summary>
        /// Доступный только автору
        /// </summary>
        Private = 1,
        /// <summary>
        /// Доступный друзьям
        /// </summary>
        FriendsOnly = 2
    }

    /// <summary>
    /// Оставление комментария в блог
    /// </summary>
    [Serializable]
    [XmlInclude(typeof(PostAttribute))]
    public class BlogPost: CommentPost
    {
        /// <summary>
        /// Уровень доступа к посту
        /// </summary>
        public PostType Type;

        /// <summary>
        /// Разные настройки поста.
        /// Из известных: tags, mood, location, music, date
        /// </summary>
        public PostAttributeCollection Attributes;

        /// <summary>
        /// Количество ссылок на пост
        /// </summary>
        //private int _links = -1;
        
        /// <summary>
        /// Количество комментов у поста
        /// </summary>
        //private int _comments = -1;

        /// <summary>
        /// Количество ссылок на пост
        /// </summary>
        public int Links { get; set; }

        /// <summary>
        /// Количество комментов у поста
        /// </summary>
        public int Comments { get; set; }

        /// <summary>
        /// Количество просмотров поста (опционально)
        /// </summary>
        public int Views;

        /// <summary>
        /// Constructor
        /// </summary>
        public BlogPost()
        {
            Attributes = new PostAttributeCollection(this);
            Type = PostType.Private;
        }

        /// <summary>
        /// Создание объекта с простой ссылой
        /// </summary>
        /// <param name="onlinkpost"></param>
        public BlogPost(Uri onlinkpost)
        {
            Attributes = new PostAttributeCollection(this);
            Type = PostType.Private;
            Link = onlinkpost;
        }

        
        /// <summary>
        /// Получение значения параметра по имени, если нет, то возвращает (String.Empty);
        /// </summary>
        /// <param name="pOpts">Тип опции, которую нужно извлечь</param>
        /// <returns></returns>
        public object GetParam(PostParams pOpts)
        {
            foreach (PostAttribute a in Attributes)
            {
                if (String.Compare(a.sName, pOpts.ToString(), true) == 0)
                {
                    return a.sValue??String.Empty;
                }
            }
            return String.Empty;
        }

        /// <summary>
        /// Выставление параметра по имени,;
        /// </summary>
        /// <param name="pOpts">Тип опции для выставления</param>
        /// <param name="value">Значение</param>
        /// <returns></returns>
        public void SetParam(PostParams pOpts, object value)
        {
            Attributes.Add(new PostAttribute(pOpts,value));
        }

        /// <summary>
        /// Возвращает объект Поста с заполненой ссылкой
        /// </summary>
        /// <param name="linkonpost">ссылка на пост</param>
        [DebuggerStepThrough]
        public static BlogPost SimpleLink(String linkonpost)
        {
            return new BlogPost(new Uri(linkonpost));
        }

        /// <summary>
        /// Возвращает объект Поста с заполненой ссылкой
        /// </summary>
        /// <param name="linkonpost">ссылка на пост</param>
        public static BlogPost SimpleLink(Uri linkonpost)
        {
            return new BlogPost(linkonpost);
        }

        /// <summary>
        /// Загружаем в приватные переменные значение из Яндекса
        /// по ссылкам и комментам
        /// </summary>
        //private void LoadLinksComms()
        //{
        //    //убедимся, что ссылка на пост задана..
        //    if (Link != null)
        //    {
        //       PostWatch pw = new PostWatch();                     
        //       pw.ExtractLinksComms(this);
        //    }
        //}
    }

    /// <summary>
    /// Пост в блог
    /// </summary>
    [Serializable]
    public class CommentPost
    {
        private string _subject;
        private string _body;
        private string _specialParam;

        /// <summary>
        /// Constructor
        /// </summary>
        public CommentPost()
        {
            _body = "";
            _subject = "";
            Existance = false;
            Link = null;
        }

        /// <summary>
        /// Существует ли запись в блогах или это еще заготовка
        /// </summary>
        public Boolean Existance;

        /// <summary>
        /// Время публикации сообщения
        /// </summary>
        public DateTime Published = DateTime.Now;

        /// <summary>
        /// Ссылка на пост или коммент 
        /// </summary>
        [XmlIgnore]
        public Uri Link;

        /// <summary>
        /// Тема поста
        /// </summary>
        public string Subject
        {
            get
            {
                return _subject;
            }
            set
            {
                _subject = value;
            }
        }

        /// <summary>
        /// Тема поста после HtmlEncode
        /// </summary>
        public string SubjectHtmlEnc
        {
            get
            {
                return HttpUtility.HtmlEncode(_subject);
            }
        }

        /// <summary>
        /// Тема поста после UrlEncode
        /// </summary>
        public string SubjectUrlEnc
        {
            get
            {
                return HttpUtility.UrlEncode(_subject);
            }
        }

        /// <summary>
        /// Содержимое поста после HtmlEncode
        /// </summary>
        public string BodyHtmlEnc
        {
            get
            {
                return HttpUtility.HtmlEncode(_body);
            }
        }

        /// <summary>
        /// Содержимое поста после UrlEncode
        /// </summary>
        public string BodyUrlEnc
        {
            get
            {
                return HttpUtility.UrlEncode(_body);
            }
        }

        /// <summary>
        /// Содержимое поста
        /// </summary>
        public string Body
        {
            get
            {
                return _body;
            }
            set
            {
                _body = value;
            }
        }

        /// <summary>
        /// Специальный параметр
        /// например номер комментария на который мы отвечаем
        /// </summary>
        /// <remarks>Название блога где был опубликован пост, can be NULL</remarks>
        public string SpecialParam
        {
            get
            {
                return _specialParam;
            }
            set
            {
                _specialParam = value;
            }
        }


        /// <summary>
        /// Проверяем установлен ли специальный параметр
        /// Должен равняться номеру коммента на который отвечаемс...
        /// </summary>
        /// <returns></returns>
        public Boolean NoSpesialParam()
        {
            Debug.WriteLine(String.Format("CommentPost.SpecialParam is {0}", SpecialParam));
            return String.IsNullOrEmpty(SpecialParam);
        }
    }
}
